#pragma once
#include"VMAC.h"
#include"VIEU.h"
// #include"../../execution_module/write_delay_control/write_delay_control.h"
#include<vector>

class VPE {
public:
    VPE(int vpe_id, RegisterFile* rf) : id(vpe_id), RF(rf) {
        vmac_1 = new VMAC(vpe_id, this->RF);
        vmac_2 = new VMAC(vpe_id, this->RF);
        vmac_3 = new VMAC(vpe_id, this->RF);
        vieu = new VIEU(vpe_id);
    }
    ~VPE() {
        delete vmac_1;
        delete vmac_2;
        delete vmac_3;
        delete vieu;
    }
    //TODO:此处还需要跟路哥确认一下内部三个VMAC的执行逻辑，是执行同一条指令还是执行三条不同的指令，如何分配寄存器的？
    //TODO:这关系到Execute函数执行一次返回的应该是一个结果还是三个结果还是64个结果
    //返回值代表一个VPE内部包含的三个VMAC和一个VIEU的执行结果，按VMAC1、VMAC2、VMAC3、VIEU的顺序存储
    // std::vector<double>* Execute();
    //该函数需要将待计算的输入值传入到每一个子模块里
    void input_distribution();
    write_req_info_reg  Execute_VMAC1(instruction* vmac_instr);
    write_req_info_reg  Execute_VMAC2(instruction* vmac_instr);
    write_req_info_reg  Execute_VMAC3(instruction* vmac_instr);
    write_req_info_reg  Execute_VIEU(instruction* vieu_instr);

private:
    int id; //表明这是16个并列的VPE中的第几个，用于操作向量寄存器（确定操作16个一组的第几个寄存器
    VMAC *vmac_1;
    VMAC *vmac_2;
    VMAC *vmac_3;
    VIEU *vieu; //!Question: 这个在模拟的过程中是必需的结构么？？
    RegisterFile* RF;
};